import random

from django import http
from django.views import View
from django_redis import get_redis_connection

from meiduo_mall.libs.captcha.captcha import captcha
from meiduo_mall.utils.response_code import RETCODE
from . import constants
from celery_tasks.sms.tasks import send_sms

from meiduo_mall.libs.yuntongxun.sms import CCP

class ImagecodeView(View):
    def get(self, request, uuid):
        # 接收
        # 验证
        # 处理:
        # 生成图形验证码数据：字符code、图片image
        text, code, image = captcha.generate_captcha()

        # 保存字符，用于后续验证
        # 连接redis，参数为caches中的键
        redis_cli = get_redis_connection('verify_code')
        # 向redis中写数据
        redis_cli.setex(uuid, constants.IMAGE_CODE_EXPIRES, code)

        # 响应：输出图片数据
        return http.HttpResponse(image, content_type='image/png')

class SMSCodeView(View):
    def get(self,request,mobile):
        # 接受请求
        image_code = request.GET.get("image_code")
        uuid = request.GET.get('image_code_id')
        #验证
        if not all([image_code,uuid]):
            return http.JsonResponse({ 'code':RETCODE.NECESSARYPARAMERR,'errmsg':'缺少必传的参数'})
        #连接数据库获取随机码
        redis_cli = get_redis_connection('verify_code')
        image_code_redis = redis_cli.get(uuid)
        if not image_code_redis:
            return http.JsonResponse({

                'code': RETCODE.IMAGECODEERR,
                'errmsg':'图形吗失效',
            })

        image_code_redis =image_code_redis.decode()  #转化成小写做比较
        if image_code_redis.lower() != image_code.lower():
            return http.JsonResponse({'code':RETCODE.IMAGECODEERR , 'errmsg':'你输入的验证吗错误'})

        #图形验证吗在用户输入与redis 数据库随机码对比后，删除----防止用户输入错误，在对比失败后，
        # 没有失效前的二次访问刷新,第一次的验证码依然可以在数据库查询得到，如果用户第二次输入和第一次随机码相同也可以验证成功，
        #则第二次刷新的随机码失去作用，所以再次当对比失败后，设置立刻从数据库删除次数据
        redis_cli.delete(uuid)

        # # 点击事件发生后的手机号标记60秒
        # redis_cli.setex('send_flag_%s' % mobile, constants.SEND_SMS_CODE_INTERVAL, 1)
        # # #
        # # #60S内标记数据短信手机号
        # if redis_cli.get('sms_flag' + mobile):
        #     return http.JsonResponse({'code':RETCODE.PARAMERR , 'errmsg':'你已请求一次,请60秒后再次刷新'})
        # #生成 短信验证码,保存在数据库
        sms_code ='%06d'% random.randint(0,999999)
        # redis_cli.setex('sms' + mobile,constants.DUANXIN_CODE_EXPIRES,sms_code)
        # 发送短信,引入第三方.发送短信验证
        # ccp = CCP()
        # ccp.send_template_sms(mobile,[sms_code,constants.DUANXIN_CODE_EXPIRES/60],1)
        #
        # print(sms_code)


        #----------
        redis_pl = redis_cli.pipeline()
        redis_pl.setex('sms_' + mobile, constants.DUANXIN_CODE_EXPIRES, sms_code)
        redis_pl.setex('sms_flag_' + mobile, constants.SEND_SMS_CODE_INTERVAL, 1)#标记为60秒
        redis_pl.execute()
        #
        # # 3.发短信
        # ccp = CCP()
        # ccp.send_template_sms(mobile, [sms_code, constants.SEND_SMS_CODE_INTERVAL / 60], 1)
        # # # print(sms_code)
        send_sms.delay(mobile, [sms_code, constants.DUANXIN_CODE_EXPIRES / 60], 1)
        #---------------
        return http.JsonResponse({
            'code':RETCODE.OK,
            'errmsg':'短信发送成功，小姐姐',

        })


#在每一次点击获取短信验证码的时候都会出发一次点击事件，前端通过ajax的请求方式对图形验证码做一次局部刷新，
        # 同时向服务器发送，电话号码，随机码，唯一标示吗，调用第三网站封装的方法，对用户发起短信验证